<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <div id="root"></div>
  <script>
    // 注册或获取全局指令。
    // 指令提供5个钩子函数：
    // - bind 只调用一次，指令第一次绑定到元素时调用
    // - inserted 被绑定元素插入父节点时调用 (仅保证父节点存在，但不一定已被插入文档中)。
    // - update 所在组件的 VNode 更新时调用，但是可能发生在其子 VNode 更新之前
    // - componentUpdated 所在组件的 VNode 及其子 VNode 全部更新后调用
    // - unbind 只调用一次，指令与元素解绑时调用

    // 指令函数参数el，binding，vnode，oldVnode
    var Profile = Vue.extend({
      template: '<p v-my-directive>{{firstName}} {{lastName}} aka {{alias}} {{obj.aa}}</p>',
      data: function () {
        return {
          firstName: 'Walter',
          lastName: 'White',
          alias: 'Heisenberg',
          obj: {
            a: 1
          }
        }
      }
    })

    // 指令(注：需放在实例化之前)
    Vue.directive('my-directive', {
      bind: function() {
        console.log('绑定指令');
      }
    })

    new Profile().$mount('#root');
</script>
</body>
</html>